import time
import random
import threading
import paho.mqtt.client as mqtt

# 配置信息
UID = "57ea5d4ca88f43cc96a3db030dd36496"  # 你的巴法云UID
SUB_TOPIC = "led"  # 要订阅的主题
PUB_TOPIC = "temp"  # 要发布的主题
MQTT_SERVER = "mqtt.bemfa.com"  # 巴法云MQTT服务器
MQTT_PORT = 9501  # 端口


# 连接成功回调
def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("连接巴法云成功")
        # 订阅led主题
        client.subscribe(SUB_TOPIC, qos=0)
        print(f"已订阅主题: {SUB_TOPIC}")
    else:
        print(f"连接失败，错误码: {rc}")


# 接收消息回调（处理led主题的消息）
def on_message(client, userdata, msg):
    topic = msg.topic
    payload = msg.payload.decode("utf-8")
    print(f"收到主题 {topic} 的消息: {payload}")
    # 这里可以添加对led消息的处理逻辑（例如控制硬件）


# 发布temp主题的线程函数
def publish_temp_thread(client):
    """定时发布温度数据到temp主题"""
    while True:
        try:
            # 模拟温度数据（实际应用中可替换为传感器读数）
            temp = round(random.uniform(20.0, 30.0), 1)
            payload = f"{temp}°C"  # 消息内容
            
            # 发布消息
            result = client.publish(PUB_TOPIC, payload, qos=0)
            status = result[0]
            if status == 0:
                print(f"已发布到 {PUB_TOPIC}: {payload}")
            else:
                print(f"发布到 {PUB_TOPIC} 失败")
                
            # 每5秒发布一次（可修改间隔时间）
            time.sleep(5)
        except Exception as e:
            print(f"发布线程错误: {e}")
            time.sleep(2)  # 出错后延迟重试


def main():
    # 创建MQTT客户端
    client = mqtt.Client(client_id=UID)  # 客户端ID设为UID
    client.username_pw_set(username=UID)  # 用户名设为UID（巴法云要求）
    
    # 设置回调函数
    client.on_connect = on_connect
    client.on_message = on_message
    
    # 连接服务器
    client.connect(MQTT_SERVER, MQTT_PORT, keepalive=60)
    
    # 启动发布temp主题的线程
    pub_thread = threading.Thread(target=publish_temp_thread, args=(client,), daemon=True)
    pub_thread.start()
    
    # 保持客户端循环（处理网络事件、回调等）
    client.loop_forever()


if __name__ == "__main__":
    main()